<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
//   let obj = { name:"盲僧",exp:"真的瞎"};

//   let obj1 = obj;  // 浅拷贝；（只拷贝的指针，没有另外开辟空间）
//   obj1.name = "抠脚大汉";
//   // 对象是引用数据类型
//   console.log(obj);

// Object.assign(); // 合并对象的 来进行对象的深拷贝

// let obj1 = Object.assign({},obj);
// obj1.name = '抠脚大汉';
// console.log(obj1);
// console.log(obj);



let obj = {
  name: "李靖",
  child: {
    name: "薛仁贵"
  }
}


// let obj1 = Object.assign({},obj);
// obj1.name = "樊梨花";
// obj1.child.name = "薛丁山";
// console.log(obj1);
// console.log(obj);


// 最简单的深拷贝；// 字符串赋值，是不存在深浅拷贝的问题的。
// let obj1 = JSON.parse(JSON.stringify(obj));
// obj1.name = "樊梨花";
// obj1.child.name = "薛丁山";
// console.log(obj1);
// console.log(obj);

// 什么是递归函数？
// 通俗的讲 函数自己调用自己


// function fn () { // 没有return 递归函数，会造成死循环
//   fn();
// }
// fn();

// let i = 0;
// function fn () { // 简单的递归函数
//   if (i<10){
//     i++;
//     console.log(i);
//     fn();
//   } else {
//      return;
//   }
// }
// fn();


// 可以使用递归函数 来进行 深拷贝；

console.log(typeof([1,3,4]));
// typeof 会把null 也判断成 object 
function copy(obj) { // 是形参
    let newObj = null; // 声明一个对象来存储拷贝之后的内容
    // debugger;
    // 判断数据类型是否是复杂的数据类型，如果是则调用自己，如果不是则直接赋值即可！
    // 由于null不可以循环但是他的类型又是object，所以这个需要对null进行判断
    if (typeof(obj) == 'object' && obj !== null){
        // 声明一个变量用以存储拷贝出来的值，根据参数的具体数据类型声明不同的类型来存储
        newObj = obj instanceof Array? [] : {};
        // 循环obj的每一项，如果里面还有复杂的数据类型的话，则直接利用递归函数再次调用。
        for(let i in obj){
            newObj[i] = copy(obj[i])
        }
    } else {
        newObj = obj
    }
    return newObj; // 函数没有返回的值的话，则为undefined
}


let obj1 = copy(obj);
// obj1.child.name = "薛丁山";
// console.log(obj1);
// console.log(obj);
</script>